
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * @author 铁磊
 * @version 创建时间：2017年12月20日 下午11:24:19
 * 类说明：协助赵阳合并数据
 */
public class Zhaoyang {

    private int flag = 0;	//用于递归的标记

    /**
     * 入口方法
     */

    public void test( List<Map<String, String>> list) {

//        Map<String, String> map1 = new HashMap<String, String>();
//        map1.put("qzhm", "14238001");
//        map1.put("zzhm", "14238002");
//        map1.put("sl", "2");
//        map1.put("fpzldm", "000008101200");
//        map1.put("jldwdm", "6500164320");
//        Map<String, String> map2 = new HashMap<String, String>();
//        map2.put("qzhm", "14238003");
//        map2.put("zzhm", "14238004");
//        map2.put("sl", "2");
//        map2.put("fpzldm", "000008101200");
//        map2.put("jldwdm", "6500164320");
//        Map<String, String> map3 = new HashMap<String, String>();
//        map3.put("qzhm", "14238005");
//        map3.put("zzhm", "14238009");
//        map3.put("sl", "5");
//        map3.put("fpzldm", "000008101200");
//        map3.put("jldwdm", "6500164320");
//        Map<String, String> map4 = new HashMap<String, String>();
//        map4.put("qzhm", "14238015");
//        map4.put("zzhm", "14240000");
//        map4.put("sl", "1986");
//        map4.put("fpzldm", "000008101200");
//        map4.put("jldwdm", "6500164320");
//        Map<String, String> map5 = new HashMap<String, String>();
//        map5.put("qzhm", "02254001");
//        map5.put("zzhm", "02254014");
//        map5.put("sl", "14");
//        map5.put("fpzldm", "1130");
//        map5.put("jldwdm", "6500172130");
//        Map<String, String> map6 = new HashMap<String, String>();
//        map6.put("qzhm", "02254015");
//        map6.put("zzhm", "02256000");
//        map6.put("sl", "1986");
//        map6.put("fpzldm", "1130");
//        map6.put("jldwdm", "6500172130");
//        Map<String, String> map7 = new HashMap<String, String>();
//        map7.put("qzhm", "14238010");
//        map7.put("zzhm", "14238014");
//        map7.put("sl", "5");
//        map7.put("fpzldm", "000008101200");
//        map7.put("jldwdm", "6500164320");
//        Map<String, String> map8 = new HashMap<String, String>();
//        map8.put("qzhm", "9");
//        map8.put("zzhm", "10");
//        map8.put("sl", "2");
//        map8.put("fpzldm", "000008101200");
//        map8.put("jldwdm", "6500164320");
//
//        List<Map<String, String>> list = new ArrayList<Map<String,String>>();
//        list.add(map4);
//        list.add(map2);
//        list.add(map3);
//        list.add(map6);
//        list.add(map1);
//        list.add(map5);
//        list.add(map7);
//        list.add(map8);

        //把不同发票种类代码的拆分，返回以发票种类代码为键，相同发票种类代码的map集合为值的map
        Map<String, List<Map<String, String>>> zzMap = split(list);

        List<Map<String, String>> allList = new ArrayList<Map<String,String>>();
        for (Entry<String, List<Map<String, String>>> entry : zzMap.entrySet()) {
            List<Map<String, String>> ml = entry.getValue();
            if (1 < ml.size()) {
                ml = merge(ml);
            }
            allList.addAll(ml);
        }
        System.out.println("铁磊测试——————————————》" + allList);
    }

    /**
     * 根据种类代码拆分
     * @param list
     * @return
     */
    public static Map<String, List<Map<String, String>>> split(List<Map<String, String>> list) {
        List<String> zldmList = new ArrayList<String>();	//存放种类代码的
        Map<String, List<Map<String, String>>> zzMap = new HashMap<String, List<Map<String, String>>>();
        for (int i = 0; i < list.size(); i ++) {
            Map<String, String> map = list.get(i);	//遍历的每一个map
            String zldm = map.get("fpzldm");
            if (0 == i) {	//第一个map就直接把种类代码存入zldmList
                zldmList.add(zldm);
                List<Map<String, String>> ml = new ArrayList<Map<String, String>>();
                ml.add(map);
                zzMap.put(zldm, ml);
            } else {
                for (int j = 0; j < zldmList.size(); j ++) {
                    String zldms = zldmList.get(j);
                    if (zldms.equals(zldm)) {	//如果种类代码在zldmList已存在，则加入zzMap中相应的list里
                        List<Map<String, String>> ml = zzMap.get(zldm);
                        ml.add(map);
                        zzMap.put(zldm, ml);
                        break;
                    } else if (j == (zldmList.size() - 1)) {	//如果不存在，且遍历到最后一个，则new一个list存入zzMap
                        zldmList.add(zldm);
                        List<Map<String, String>> ml = new ArrayList<Map<String, String>>();
                        ml.add(map);
                        zzMap.put(zldm, ml);
                        break;
                    }
                }
            }
        }
        return zzMap;
    }

    /**
     * 根据起止号码合并
     * @param list
     * @return
     */
    private List<Map<String, String>> merge(List<Map<String, String>> list) {
        this.flag = 0;
        for (int i = 0; i < list.size(); i ++) {
            Map<String, String> iMap = list.get(i);
            int iQzhm = Integer.valueOf(iMap.get("qzhm"));
            int iZzhm = Integer.valueOf(iMap.get("zzhm"));
            for (int j = 0; j <list.size(); j ++) {
                Map<String, String> jMap = list.get(j);
                int jQzhm = Integer.valueOf(jMap.get("qzhm"));
                int jZzhm = Integer.valueOf(jMap.get("zzhm"));
                if (j != i) {
                    if (iZzhm + 1 == jQzhm) {
                        this.flag = 1;
                        int iSl = Integer.valueOf(iMap.get("sl"));
                        int jSl = Integer.valueOf(jMap.get("sl"));
                        String sl = String.valueOf(iSl + jSl);
                        list.get(i).put("sl", sl);
                        list.get(i).put("zzhm", list.get(j).get("zzhm"));
                        list.remove(j);
                        break;
                    } else if (iQzhm - 1 == jZzhm) {
                        this.flag = 1;
                        int iSl = Integer.valueOf(iMap.get("sl"));
                        int jSl = Integer.valueOf(jMap.get("sl"));
                        String sl = String.valueOf(iSl + jSl);
                        list.get(i).put("sl", sl);
                        list.get(i).put("qzhm", list.get(j).get("qzhm"));
                        list.remove(j);
                        break;
                    }
                }
            }
        }
        if (1 == this.flag) {	//递归
            return merge(list);
        } else {
            return list;
        }
    }
}
